package com.itcam.example;

import picocli.CommandLine.Option;
import picocli.CommandLine;

import java.util.concurrent.Callable;

/**
 * 🌟 Login 类实现了 Callable 接口，用于处理用户登录相关的操作。
 * 它允许用户通过命令行选项输入用户名、密码，并对密码进行二次确认。
 */
public class Login implements Callable<Integer> {
    /**
     * 👤 存储用户输入的用户名，可通过命令行选项 -u 或 --user 输入。
     */
    @Option(names = {"-u", "--user"}, arity = "0..1", description = "User name")
    String user;

    /**
     * 🔑 存储用户输入的密码，可通过命令行选项 -p 或 --password 交互式输入。
     */
    @Option(names = {"-p", "--password"}, arity = "0..1", description = "Passphrase", interactive = true)
    String password;

    /**
     * 🔍 用于检查密码的字段，可通过命令行选项 -cp 或 --checkPassword 交互式输入。
     * 此密码将与主密码进行比对，以确保输入的准确性。
     */
    @Option(names = {"-cp", "--checkPassword"}, description = "Check Password", interactive = true)
    String checkPassword;

    /**
     * 🚀 实现 Callable 接口的 call 方法，该方法是登录逻辑的核心执行点。
     *
     * 在该方法中，会将用户输入的密码和用于检查的密码进行输出展示，方便调试和确认。
     *
     * @return 返回一个整数值，这里固定返回 0，表示操作已成功执行。
     *         在更复杂的场景中，可根据不同的执行结果返回不同的值。
     * @throws 如果在执行过程中发生异常，例如密码读取错误等。
     */
    public Integer call() throws Exception {
        // 📄 打印用户输入的密码，方便调试和确认
        System.out.println("password = " + password);
        // 📄 打印用户输入的检查密码，用于比对和确认
        System.out.println("checkPassword = " + checkPassword);
        // 📈 返回操作结果，这里固定返回 0 表示操作成功
        return 0;
    }

    /**
     * 🌟 程序的入口点，用于测试 Login 类的功能。
     *
     * 在该方法中，会创建一个 CommandLine 对象，并传入 Login 类的实例，
     * 然后执行命令行参数，模拟用户输入用户名和密码的过程。
     *
     * @param args 命令行参数，这里会传入预设的用户名和密码选项。
     */
    public static void main(String[] args) {
        // 🛠 创建一个 CommandLine 对象，并执行命令行参数，模拟用户登录操作
        new CommandLine(new Login()).execute("-u", "user123", "-p", "-cp"); // ❗由于picocli框架的规则，用户必须在命令中指定需要交互式输入的选项，才会引导用户输入
    }

    /*
        可选交互式：用户可以直接在整行命令中输入选项，而不用给用户提示信息
        强制交互式：用户必须获得提示并输入某个选项
     */
}
